package main.java.datosPrueba;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import main.java.aplicacion.categorias.excepciones.CategoriaError;
import main.java.aplicacion.categorias.interfaces.CategoriaMgt;
import main.java.aplicacion.categorias.manejadores.CategoriaMgr;
import main.java.aplicacion.juegos.interfaces.JuegoMgt;
import main.java.aplicacion.juegos.manejadores.JuegoMgr;
import main.java.aplicacion.systemfactory.SystemFactory;
import main.java.aplicacion.usuarios.excepciones.UsuarioError;
import main.java.aplicacion.usuarios.interfaces.UsuariosMgt;
import main.java.aplicacion.usuarios.manejadores.UsuarioMgr;
import main.java.datatypes.juegos.JuegoVO;
import main.java.datatypes.juegos.VersionVO;
import main.java.datatypes.usuarios.ClienteVO;
import main.java.datatypes.usuarios.DesarrolladorVO;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class CargarDatos {

	Map<String, String> users = new HashMap<String, String>();
	Map<String, String> cats = new HashMap<String, String>();
	Map<String, String> games = new HashMap<String, String>();
	Map<String, List<InfoVersionVO>> versiones = new HashMap<String, List<InfoVersionVO>>();
	
	public void cargarDatos(File archCargaDatos) {
		try {
			FileInputStream archivo = new FileInputStream(archCargaDatos);
			POIFSFileSystem fichero = new POIFSFileSystem(archivo);
			HSSFWorkbook libro = new HSSFWorkbook(fichero);
			cargarPerfiles(libro);
			cargarCategorias(libro);
			cargarJuegos(libro, archCargaDatos.getParentFile());
			cargarCompras(libro);
			cargarComentarios(libro);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void cargarPerfiles(HSSFWorkbook excel) {
		UsuariosMgt umgt = SystemFactory.getInstance().getUsuarioMgt();
		HSSFSheet hojaPerfiles = excel.getSheet("Perfiles");
		HSSFSheet hojaWeb = excel.getSheet("Sitios Web Desarr.");

		for (int numFila = 1; numFila <= hojaPerfiles.getLastRowNum(); numFila++) {
			HSSFRow fila = hojaPerfiles.getRow(numFila);

			String referencia = fila.getCell(0).getStringCellValue();
			String nick = fila.getCell(1).getStringCellValue();
			String mail = fila.getCell(2).getStringCellValue();
			String nombre = fila.getCell(3).getStringCellValue();
			String apellido = fila.getCell(4).getStringCellValue();
			Date nacimiento = fila.getCell(5).getDateCellValue();
			int edad = (int) fila.getCell(6).getNumericCellValue();
			String pass = fila.getCell(7).getStringCellValue();

			SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
			String fecha = new String(dateformat.format(nacimiento));

			boolean tieneMail = false;
			String web = "";
			for (int numRef = 0; numRef <= hojaWeb.getLastRowNum(); numRef++) {
				HSSFRow filaRef = hojaWeb.getRow(numRef);
				String auxref = filaRef.getCell(0).getStringCellValue();
				if (referencia.equals(auxref)) {
					web = filaRef.getCell(1).getStringCellValue();
					tieneMail = true;
					break;
				}
			}
			try {
				if (tieneMail) {
					DesarrolladorVO des = new DesarrolladorVO(nick, mail, nombre, apellido, nacimiento, edad, nick, web, pass);
					umgt.agregarUsuario(des);
				} else {
					ClienteVO cli = new ClienteVO(nick, mail, nombre, apellido, nacimiento, edad, nick, pass);
					umgt.agregarUsuario(cli);
				}
				this.users.put(referencia, nick);
			} catch (UsuarioError e) {
				e.printStackTrace();
			}
		}

	}

	public void cargarCategorias(HSSFWorkbook excel) {
		CategoriaMgt catmgr = SystemFactory.getInstance().getCategoriaMgt(); 
		HSSFSheet hojaPerfiles = excel.getSheet("Categorías");

		for (int numFila = 1; numFila <= hojaPerfiles.getLastRowNum(); numFila++) {
			HSSFRow fila = hojaPerfiles.getRow(numFila);
			String referencia = fila.getCell(0).getStringCellValue();
			String nombre = fila.getCell(1).getStringCellValue();
			try {
				catmgr.altaCategoria(nombre);
			} catch (CategoriaError e) {
				System.out.println("error al agregar categoria " + nombre
						+ " del archivo excel.");
			}
			this.cats.put(referencia, nombre);
		}
	}

	public void cargarJuegos(HSSFWorkbook excel, File subdir) {
		JuegoMgt jmgt = SystemFactory.getInstance().getJuegoMgt(); 
		
		HSSFSheet hojaJuegos = excel.getSheet("Juegos");
		HSSFSheet hojaDesc = excel.getSheet("Descripciones Juegos");
		HSSFSheet hojaVer = excel.getSheet("Versiones");
		
		for (int nFila = 1; nFila <= hojaVer.getLastRowNum(); nFila++) {
			HSSFRow filaVer = hojaVer.getRow(nFila);
			InfoVersionVO info = new InfoVersionVO();
			
			String ref = filaVer.getCell(0).getStringCellValue();
			info.setNumero(filaVer.getCell(1).getStringCellValue());
			info.setEstado(filaVer.getCell(2).getStringCellValue());
			info.setOrdVersion(filaVer.getCell(3).getNumericCellValue());
			String motivo = filaVer.getCell(4).getStringCellValue();
			if (motivo != null){
				info.setMotivo(motivo);
			}
			if (this.versiones.get(ref) == null){
				List<InfoVersionVO> lista = new ArrayList<InfoVersionVO>();
				lista.add(info);
				versiones.put(ref,lista);
			}else{
				this.versiones.get(ref).add(info);
			}
		}

		for (int numFila = 1; numFila <= hojaJuegos.getLastRowNum(); numFila++) {
			HSSFRow fila = hojaJuegos.getRow(numFila);
			String referencia = fila.getCell(0).getStringCellValue();
			String nombre = fila.getCell(1).getStringCellValue();
			String version = fila.getCell(2).getStringCellValue();
			String categoriaRef = fila.getCell(3).getStringCellValue();
			String desarrolladorRef = fila.getCell(4).getStringCellValue();
			double p = fila.getCell(5).getNumericCellValue();
			String precio = Double.toString(p);

			if (categoriaRef.contains(",")) {
				String catAux = categoriaRef.replace(" ", "");
				List<String> categorias = new ArrayList<String>();

				while (catAux.contains(",")) {
					String cat = catAux.substring(0, catAux.indexOf(","));
					categorias.add(cat);
					catAux = catAux.substring(catAux.indexOf(",") + 1);
				}
				jmgt.crearJuego(nombre, this.cats.get(catAux),this.users.get(desarrolladorRef), "0", precio);
				for (String c : categorias) {
					jmgt.agregarCategoria(nombre, this.cats.get(c));
				}

			} else {
				jmgt.crearJuego(nombre, this.cats.get(categoriaRef),
						this.users.get(desarrolladorRef), "0", precio);
			}
			
			List<InfoVersionVO> ver = this.versiones.get(referencia);
			for (InfoVersionVO iver : ver){
				File file =  new File(subdir, "+nombre"+".v"+iver.getNumero()+".jar");
				double tam = file.length();
				jmgt.altaVersionJuego(nombre,iver.getNumero(),  tam , "");
				VersionVO v = new VersionVO(iver.getNumero(), nombre, this.users.get(desarrolladorRef), "",tam, "", "");
				if (iver.getEstado().equals("Aprobada")){
					jmgt.aceptarVersion(v);
				}else if(iver.getEstado().equals("Rechazada")){
					jmgt.rechazarVersion(v, iver.getMotivo());
				}

			}
			this.games.put(referencia, nombre);

		}
		for (int numFila = 1; numFila <= hojaDesc.getLastRowNum(); numFila++) {
			HSSFRow fila = hojaDesc.getRow(numFila);
			String referencia = fila.getCell(0).getStringCellValue();
			String des = fila.getCell(1).getStringCellValue();
			jmgt.agregarDescr(games.get(referencia), des);
		}
	}

	public void cargarCompras(HSSFWorkbook excel) {
		JuegoMgt jmgr = SystemFactory.getInstance().getJuegoMgt(); 
		HSSFSheet hojaCompras = excel.getSheet("Compras");
		
		for (int numFila = 1 ; numFila <= hojaCompras.getLastRowNum() ; numFila++){
			HSSFRow fila = hojaCompras.getRow(numFila);
			String refUsuario = fila.getCell(0).getStringCellValue();
			String refJuego = fila.getCell(1).getStringCellValue();
			Date fecha = fila.getCell(2).getDateCellValue();
			jmgr.confirmarCompra(fecha, this.users.get(refUsuario), this.games.get(refJuego));
		}
	}
	
	public void cargarComentarios(HSSFWorkbook excel) {
		JuegoMgt jmgt = SystemFactory.getInstance().getJuegoMgt();
		//comentarios va a contener como clave la referencia de excel y el valor va a ser en numero de comentario del juego.
		Map<String, Integer> comentarios = new HashMap<String, Integer>();
		
		HSSFSheet hojaComentarios = excel.getSheet("Comentarios");
		for (int numFila = 1 ; numFila <= hojaComentarios.getLastRowNum() ; numFila++){
			HSSFRow fila = hojaComentarios.getRow(numFila);
			String ref = fila.getCell(0).getStringCellValue();
			String refPadre = fila.getCell(1).getStringCellValue();
			String refUsuario = fila.getCell(2).getStringCellValue();
			String refJuego = fila.getCell(3).getStringCellValue();
			Date fecha = fila.getCell(4).getDateCellValue();
			String contenido = fila.getCell(5).getStringCellValue();
			
			if (refPadre == null || refPadre.isEmpty()){
				int aux = jmgt.agregarComentario(0, this.users.get(refUsuario), this.games.get(refJuego), fecha ,contenido);
				comentarios.put(ref, aux);
			}else{
				int aux = jmgt.agregarComentario(comentarios.get(refPadre), this.users.get(refUsuario), this.games.get(refJuego), fecha ,contenido);
				comentarios.put(ref, aux);
			}
		
		}
	}
}
